package com.zhongbo.java.websocket.web.websocket;

import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

import javax.websocket.Session;
import java.util.HashMap;
import java.util.Map;

/**
 * 说明：
 * <p>
 * ws核心方法:
 * 1.建立连接
 * 2.接收消息
 * 3.断开连接
 *
 * @author 钟波dellNotebook
 * @since 2025年03月18日 星期二 09:35:50
 */
public class ChatHandler extends TextWebSocketHandler {

    public ChatHandler() {
        System.out.println("进入了 ChatHandler 构造方法");
    }

    /**
     * 客户端连接对象缓存
     */
    Map<String, WebSocketSession> sessionCacheMap = new HashMap<>();

    /**
     * 建立websocket时,处理逻辑
     *
     * @param session ws会话对象
     * @throws Exception 异常信息
     */
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        String sessionId = session.getId();
        sessionCacheMap.put(sessionId, session);
        System.out.println("建立ws连接: " + sessionId);
    }

    /**
     * 关闭websocket时, 处理逻辑
     *
     * @param session ws会话对象
     * @param status  关闭状态码
     * @throws Exception 异常信息
     */
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        String sessionId = session.getId();
        sessionCacheMap.remove(sessionId);
        System.out.println("已断开ws的连接, Id: " + sessionId);
    }

    /**
     * 处理ws客户端发送过来的文本消息
     *
     * @param session ws会话对象
     * @param message 文本消息内容
     * @throws Exception 异常信息
     */
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        String sessionId = session.getId();
        // 消息长度
        int payloadLength = message.getPayloadLength();
        // 消息内容
        String payload = message.getPayload();
        System.out.println(String.format("接收到文本消息: id=[%s],length=[%s],content=[%s]"
                , sessionId, payloadLength, payload));
        if (payload.startsWith("001")) {
            doJob001(payload);
        }
    }

    private void doJob001(String payload) {

    }

}
